PCL库学习(二) (点云滤波)

您所在的位置:网站首页 高斯滤波 点云 PCL库学习(二) (点云滤波)

PCL库学习(二) (点云滤波)

2024-07-07 19:32| 来源: 网络整理| 查看: 265

PCL库学习(二)(滤波算法详解)

文章目录 PCL库学习(二)(滤波算法详解)1. 低通滤波器(NOISE filter)2. 高斯滤波3. 统计滤波

简介:上一章对pcl进行了整体概述,这一节将对pcl滤波算法进行详解。pcl源代码提供了多种点云处理方式,本节先对源码进行解析,后续将会自己编写一些针对性的滤波算法。

在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中将不可避免的出现一些噪声。在点云处理流程中滤波处理作为预处理的第一步,对后续的影响比较大,只有在滤波预处理中将噪声点 ,离群点,孔洞,数据压缩等按照后续处理定制,才能够更好的进行配准,特征提取,曲面重建,可视化等后续应用处理,PCL中点云滤波模块提供了很多灵活实用的滤波处理算法,例如:双边滤波,高斯滤波,条件滤波,直通滤波,基于随机采样一致性滤波RANSAC等。滤波模块是作为 PCL的一个重要处理模块,其在应用中可以非常方便与其他点云处理流程协同使用。

1. 低通滤波器(NOISE filter)

局部范围内拟合平面,设置适当的阈值,把远离平面的点当做离群点删除,适合于处理大块平整点云。但是,特别是如果使用太高的内核半径(或太低的错误阈值),它将“吃掉”角落。为了保存角点或锐边,可以尝试以较小的半径和相对较高的错误阈值重复运行该算法。 pkyjkCR.jpg Points/Radius:选择在每个点周围提取给定数量的邻居(适用于密度恒定的云)或指定球半径(球应该足够大,通常至少可以捕获6个点) Max error:输入最大误差(点到拟合平面的距离),以确定点是否被删除。误差可以是相对的Relative(作为拟合平面上邻域重投影误差的一个因子)或绝对的Absolute。 Remove isolated points:去除孤立点。如果使用的是②位置的半径搜索,球邻域内少于3个点,则认为该点为孤立点,剔除。 **总结:**低通滤波器包含了KNN算法,通过球状空间囊括最近领域的点云数据对离群点云进行了滤波,可以减少毛刺,但对于大面积点云没有较好的滤除效果。

2. 高斯滤波

高斯滤波 Spatial sigma:滤波器空间部分的正态分布方差 Scalar sigma:滤波器标量部分的正态分布方差 pkyjfIJ.jpg 高斯滤波代码如下:

/// template bool pcl::filters::GaussianKernel::initCompute () { if (sigma_ == 0) { PCL_ERROR ("Sigma is not set or equal to 0!\n", sigma_); return (false); } sigma_sqr_ = sigma_ * sigma_; if (sigma_coefficient_) { if ((*sigma_coefficient_) > 6 || (*sigma_coefficient_) < 3) { PCL_ERROR ("Sigma coefficient (%f) out of [3..6]!\n", (*sigma_coefficient_)); return (false); } else threshold_ = (*sigma_coefficient_) * (*sigma_coefficient_) * sigma_sqr_; } return (true); } /// template PointOutT pcl::filters::GaussianKernel::operator() (const Indices& indices, const std::vector& distances) { using namespace pcl::common; PointOutT result; float total_weight = 0; std::vector::const_iterator dist_it = distances.begin (); for (Indices::const_iterator idx_it = indices.begin (); idx_it != indices.end (); ++idx_it, ++dist_it) { if (*dist_it


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3